<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // 浅拷贝:针对于引用数据类型的数据进行赋值的一种操作概念，只针对于数组或者对象的第一层数据进行赋值操作
        // 1.循环赋值
        var arr=[1,2,3,4,["a","b","c"]];
        var user={name:"tom",age:23,skills:["唱歌","跳舞","打篮球"]};
        // a.循环浅拷贝数组
        function copy(obj){
            let arrs=[];
            for(let i in obj){
                arrs[i]=obj[i];//arrs[0]=obj[0] arrs[1]=obj[1] arrs[2]=obj[2] arrs[3]=obj[3] arrs[4]=obj[4]
            }
            return arrs;
        }
        // var ar=copy(arr);
        // ar[4][0]="吃饭";
        // console.log(ar);
        // console.log(arr);

        //循环浅拷贝对象
        function copy2(obj){
            let objs={};
            for(let i in obj){
                objs[i]=obj[i];
            }
            return objs;
        }
        // var u=copy2(user);
        // u["skills"][0]="rap";
        // console.log(u);
        // console.log(user);

        // b.解构赋值的浅拷贝
        let [...arrays]=arr;
        arrays[4][0]="出去玩";
        console.log(arrays);
        console.log(arr);

        // c.展开运算符的浅拷贝
        let arr2=[...arr];
        let user2={...user};
        arr2[4][2]="哈哈哈";
        user2["skills"][1]="轮滑";
        console.log(arr);
        console.log(user);

        // 深拷贝：针对于引用数据类型进行赋值的一种概念，只针对于数组或者对象的每一层数据进行赋值操作
        // a.JSON工具包（JSON工具包内置方法本身自带深度循环）
        var newArr=[1,2,3,4,["a","b","c"]];
        var str=JSON.stringify(newArr);
        console.log(str);
        var newArrs=JSON.parse(str);
        newArrs[4][0]="嘿嘿哈哈";
        console.log(newArrs);
        console.log(newArr);

        // b.递归拷贝
        // 递归:在一个函数执行的时候，函数调用了函数本身，递归函数中必须存在一个明确的逻辑判断
        let users={
            id:1,
            name:"嘿嘿",
            addr:{
                city:"南京"
            }
        };

        function deepCopy(obj1,obj2){
            for(let key in obj2){
                if(typeof obj2[key]=="object"){
                    obj1[key]={};//obj1["addr"]={};
                    deepCopy(obj1[key],obj2[key]);//递归，deepCopy(userOne["addr"],users["addr"])
                }else{
                    obj1[key]=obj2[key];
                }
            }
        }
        let userOne={};
        deepCopy(userOne,users);
        userOne.addr.city="香港";
        console.log(userOne);
        console.log(users);
    </script>
</head>
<body>
    
</body>
</html>